package com.jingding.procurement.ex.handle;

import com.jingding.procurement.ex.ServiceException;
import com.jingding.procurement.restful.ServiceCode;
import com.jingding.procurement.web.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.StringJoiner;

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandle {

    private final SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


    @ExceptionHandler
    public JsonResult handleServiceException(ServiceException e) {
        log.error("统一处理ServiceException，将向客户端响应：{}", e.getMessage());
        return JsonResult.fail(e);
    }

    @ExceptionHandler
    public JsonResult handleBindException(BindException e) {
        log.error("统一处理BindException，将向客户端响应：{}", e.getMessage());
        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
        StringJoiner stringJoiner = new StringJoiner("；", "", "。");
        for (FieldError fieldError : fieldErrors) {
            stringJoiner.add(fieldError.getDefaultMessage());
        }
        String message = stringJoiner.toString();
        return JsonResult.fail(ServiceCode.ERR.getCode(), message);
    }
    @ExceptionHandler
    public JsonResult httpMessageNotReadableException(HttpMessageNotReadableException e) {

        StackTraceElement ste =e.getStackTrace()[0];
        log.error("======================================================");
        log.error("统一处理httpMessageNotReadableException");
        log.error("异常时间："+time.format(new Date()));
        log.error("异常信息："+e.getMessage());
        log.error("异常类："+ste.getClassName());
        log.error("异常类名："+ste.getFileName());
        log.error("异常行号："+ste.getLineNumber());
        log.error("异常方法："+ste.getMethodName());
        log.error("==================================================");
        return JsonResult.fail(ServiceCode.JSON_ERR.getCode(), ServiceCode.JSON_ERR.getMessage());
    }
    @ExceptionHandler
    public JsonResult sqlException(SQLException e){
        StackTraceElement ste =e.getStackTrace()[0];
        log.error("======================================================");
        log.error("统一处理SQLException");
        log.error("数据库执行异常时间："+time.format(new Date()));
        log.error("数据库执行异常信息："+e.getMessage());
        log.error("数据库执行异常类："+ste.getClassName());
        log.error("数据库执行异常类名："+ste.getFileName());
        log.error("数据库执行异常行号："+ste.getLineNumber());
        log.error("数据库执行异常方法："+ste.getMethodName());
        log.error("==================================================");
        return JsonResult.fail(ServiceCode.SQL_ERR.getCode(), ServiceCode.SQL_ERR.getMessage());
    }

    @ExceptionHandler
    public JsonResult handleThrowable(Throwable e) {
        StackTraceElement ste =e.getStackTrace()[0];
        log.error("======================================================");
        log.error("未捕获异常处理");
        log.error("异常时间：{},",time.format(new Date()));
        log.error("异常信息："+e.getMessage());
        log.error("异常类："+ste.getClassName());
        log.error("异常类名："+ste.getFileName());
        log.error("异常行号："+ste.getLineNumber());
        log.error("异常方法："+ste.getMethodName());
        log.error("==================================================");
        return JsonResult.fail(ServiceCode.ERR_UNKNOWN.getCode(),ServiceCode.ERR_UNKNOWN.getMessage());
    }
}
